Visualização com ggplot2 - 2

1 Introdução

Os exercícios a seguir foram retirados do site https://www.yan-holtz.com/PDF/Ggplot2_basicTP.html. Esta lista contempla algumas funcionalidades básicas do ggplot2, além de fazer uso do pacote dplyr para a manipulação dos dados.

Para fazer esta lista, crie um notebook no Rstudio. Tente separar os exercícios em chunks e documentar os comentários/respostas pertinentes. Para realizar os exercícios, precisaremos carregar os pacotes ggplot2 e dplyr :

library(ggplot2)
library(dplyr)

# caso algum pacote não esteja instalado: install.packages(...)

Podemos, alternativamente, carregar a biblioteca tidyverse, que “contém” (dentre outros) os pacotes ggplot2 e dplyr:

library(tidyverse)

2 Correlação

Nesta secção, iremos abordar scatterplots e bubble plots, dois dos gráficos mais comuns para visualizar correlações entre variáveis.

2.1

Carrege o dataset gapminder, contido no pacote gapminder. Observe as primeiras 6 linhas com a função head() e descreva brevemente o que você observa. Quantas linhas este dataset tem? Utilize a função nrow():

# instale o pacote se necessário: install.packages(...)

# carregue o pacote
library(...)

# agora que você carregou o pacote, o objeto gapminder pode ser acessado. Dê uma olhada:
head(...)

# quantas linhas?
nrow(...)

2.2

Quantos anos estão disponíveis neste dataset? Quantas observações (“data-points”) existem para cada ano? Abaixo temos o código completo para responder a essas perguntas (lembre-se dos verbos do dplyr, e caso você não conheça alguma das funções, consulte help(...) ou ?...).

# Número de anos diferentes:

gapminder %>%
  select(year) %>%
  unique() %>%
  nrow()
  
# número de países disponíveis por ano?

gapminder %>%  
  group_by(year)
  summarize( n=n() )
  

2.3

Construa um scatterplot mostrando a relação entre gdpPercap e lifeExp em 1952. Utilize geom_point(). O que você observa?

# complete as lacunas

gapminder %>%  
  filter(year=="1952") %>%
  ggplot( aes(x=..., y=...)) +
    geom...

2.4

No gráfico anterior, um país se destaca. Qual? Complete o código abaixo para identificá-lo:

gapminder %>%
  filter(...)

Você deverá obter algo como:

## # A tibble: 1 x 6
##   country continent  year lifeExp    pop gdpPercap
##   <fct>   <fct>     <int>   <dbl>  <int>     <dbl>
## 1 Kuwait  Asia       1952    55.6 160000   108382.

2.5

Agora, contrua o mesmo scatterplot, mas sem exibir este país. Você percebe alguma tendência? Qual? Ela faz sentido? O que poderia melhorar na visualização?

# complete:

gapminder %>%
  filter(...) %>%
  ggplot(...

Você deve obter um gráfico como este:

2.6

Colora os pontos de acordo com seus continentes (coluna continent). No parâmetro aes(), use o argumento color (lembre-se de recorrer ao help(ggplot) ou ?ggplot)

gapminder %>%
  filter(...) %>%
  ggplot( aes(..., color=...)) +
    ...

2.7

Vamos adicionar mais uma variável à nossa visualização: fazer o tamanho dos círculos proporcional à população do país (pop). Isto é feito utilizando o argumento size de aes().

2.8 Bônus

Agora, tente o seguinte:

  • experimente o tema theme_minimal() do ggplot2
  • adicione transparência para os círculos com o argumento alpha em geom_point()
  • ordene os dados por tamanho de população para colocar os círculos menores por cima dos maiores
  • utilize a função ggplotly() do pacote plotly para tornar este gráfico interativo

Você deverá obter algo como este gráfico:

3 Distribuições

Esta parte é dedicada à visualização de distribuições. Separaremos em duas partes:

  • Visualizando uma distribuição
  • Comparando distribuições para diversos grupos ou variáveis

3.1 Uma distribuição

Utilizaremos um dataset contendo o preço de AirBnb por noite de ~1000 residências na Riviera francesa. Os dados estão armazenados no Github, e podem ser carregados da seguinte forma:

# Carregando o dataset a partir do github

data <- read.table("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/1_OneNum.csv", header=TRUE)

3.1.1

O dataset contém quantas linhas? (use nrow()). Qual é o valor mínimo? E o máximo (utilize summary() )? Você observa algo estranho? Que tipo de gráfico você utilizaria para visualizar estes dados.

3.1.2

Construa um histograma com os dados, utilizando geom_histogram(). Você está satisfeito com o resultado? Como podemos melhorar?

data %>%
  ggplot( aes(...)) +
    geom_histogram()

3.1.3

Construa um histograma contemplando preços cima de 1500 euros. ggplot2 vai mostrar uma mensagem de erro, por quê? O que ela significa? Qual é a maior desvantagem deste histograma?

data %>%
  fil.. %>%
  gg...
  

3.1.4

Construa o histograma com diferentes valores de binwidth (a largura das barras), para preços menores que 400 euros. O que você observa? É importante “brincar” com este parâmetro?

...
    geom_histogram(binwidth = ...)

3.1.5

Utilize geom_density() para construir um gráfico de densidade. Utilize o argumento fill para escolher a cor. Utilize o help() para descobrir qual é o equivalente de binwidth para o gráfico de densidade. Observe o efeito para diferentes valores.

3.2 Várias distribuições

Para esta secção, utilizaremos outro dataset armazenado no Github. Perguntas como Que probabilidade você designaria à frase Altamente provável foram respondidas em uma escala de 0-100. Estes dados nos permitem entender como as pessoas percebem o vocabulário de probabilidades. vamos carregar este dataset da seguinte forma:

# carregando os dados

data <- read.table("https://raw.githubusercontent.com/holtzy/Teaching/master/DATA/probability.csv", header=TRUE, sep=",")

3.2.1

Como de costume, verifique as principais características destes dados com nrow(), head(), summary() ou qualquer outra função que você considere útil.

3.2.2

Que tipo de gráfico você utilizaria para compara as 8 categorias?

3.2.3

Construa um boxplot simples, utilizando o default de geom_boxplot()

data %>%
  ggplot( aes(x=..., y=..., fil=...)) +
    geom_boxplot()
    

3.2.4

O que você observa? Você consegue melhorar este gráfico? O que você mudaria? Você lembra o que cada parte do “box” representa?

3.2.5

Adicione as seguintes modificações ao gráfico anterior: * ordenar os grupos em ordem crescente da mediana da coluna value. Isto é feito utilizando o pacote forcats * inverter os eixos X e Y (coord_flip()) * elimine a legenda (theme)

library(forcats) #  desnecessário se você utilizou library(tidyverse)

data %>%
  mutate(text = fct_reorder(text, value, .fun = median)) %>%  
  ggplot( aes(...)) + 
    geom_box... + 
    theme( ... ) +
    ...
    
    

3.2.6

Qual é a desvantagem deste boxplot? Como podemos melhorá-lo?

3.2.7

Vamos agora mostrar as observações individualmente utilizando geom_jitter(). Explique o que esta função faz. Tente conseguir um bom gráfico utilizando as opções width, size, alpha e color.

data %>%
  mutate(text = fct_reorder(text, value, .fun = median)) %>%
  ggplot(aes(x=text, y=value, fill=text)) +
    geom_boxplot() +
    geom_jitter(color="grey", width=.4, size=.5, alpha=.8) +
    theme(
      legend.position = "none"
    ) +
    coord_flip()

3.2.8 Bônus

  • construa um violin plot com geom_violin()
  • descubra como adicionar um círculo vermelho representando a média de cada grupo
  • faça uma busca na internet para construir um ridgeline chart

4 Ranqueamento

Nesta seção iremos utilizar os dados dos 50 maiores exportadores de armas (em 2017). Este dataset está disponível no github. Carregando os dados:

# Carregando o dataset do github

data <- read.table("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/7_OneCatOneNum.csv", header=TRUE, sep=",")

4.1

Dê uma olhada nos dados, e descreva-os. Quais gráficos podem ser utilizados para vizualisar estes dados? Qual seria o melhor, na sua opinião? Quais países estão no topo do ranking?

4.2

Comece com um gráfico de barras básico utlizando geom_bar(). Observação: por default geom_bar() aceita uma variável categórica como entrada, utilizada no eixo x, e conta o número de casos a cada posição x exibindo os no eixo y. No nosso caso, queremos um valor de y para cada grupo, por isso precisamos especificar stat="identity".

data %>%
  ggplot( ... ) +
    geom_bar(stat="identity")

4.3

Colora todas as barras com a mesma cor: #69b3a2. Não gostou da cor? Escolha outra. Você tem que utilizar fill ou color? Por quê?

4.4

Escolha uma cor diferente para cada barra. Você gosta do resultado? Ele é útil? Você entende a diferença entre adicionar a opção de cor dentro ou fora de aes()?

4.5

Os gráficos anteriores não são ideais, certo? O que você pode melhorar?

4.6

Tente o seguinte:

  • utilize coord_flip() para obter uma versão horizontal

  • observe o código abaixo para reordenar os países:

data %>%
  # reorganizar os dados
  arrange(Value) %>%
  mutate(Country=factor(Country,Country)) %>%
  
  # faça o gráfico
  ...
  

você deve obter algo como:

4.7

Um lollipop plot é utilizado sob as mesmas circunstâncias que um gráfico de barras. Contrua um com:

  • geom_segment() para as linhas. Argumentos necessários são x, xend, y e yend.
  • geom_point() para os círculos.

você deve obter:

4.8 Bônus

  • Melhore o gráfico anterior com o tema theme_minimal.
  • Pesquise treemaps. Aplique este gráfico para os dados acima. Você deve obter algo como o gráfico abaixo:
  • Pesquise o que é um gráfico de barras circular (circular barchart). Quais são seus prós e contras? Tente implementá-lo em R e com ggplot2.

5 Evolução

Vamos considerar a evolução do preço de bitcoins entre Abril de 2013 e Abril de 2018. Os dados estão disponíveis no github. Carregue o dataset utilizando o código:


data <- read.table("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/3_TwoNumOrdered.csv", header=T)


data$date <- as.Date(data$date)

5.1

Construa um gráfico básico mostrando a evolução dos preços de bitcoin utilizando geom_line().

data %>%
  ggplot(...) +
    geom_line()

5.2

Faça agora um gráfico de área utilizando geom_area(). Utilize color e fill para customizar as cores do gráfico.

5.3

Selecione os últimos 10 valores utilizando tail(). Construa um scatterplot conectado (pontos ligados por linhas), com geom_point(), geom_line() e geom_area().

5.4 Bônus

Pesquise séries temporais. Tente utilizar o widget HTML dygraph para construir uma versão interativa deste gráfico. Você deve obter algo como: